package dao;

import cn.demoncat.util.mongo.dao.BaseMongoDao;
import cn.demoncat.util.mongo.util.CriteriaUtil;
import cn.demoncat.util.mongo.util.QueryUtil;
import doc.UserGeoDoc;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.NearQuery;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 用户坐标
 * 
 * @author 延晓磊
 *
 * @since 2019年5月15日
 */
@Component
public class UserGeoDao extends BaseMongoDao<UserGeoDoc, String> {

	/**
	 * 查询矩形范围内的坐标
	 * 
	 * @param name		名称
	 * @param x1		左上角经度：空表示不限制范围
	 * @param y1		左上角纬度
	 * @param x2		右下角经度
	 * @param y2		右下角纬度
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年12月23日
	 */
	public List<UserGeoDoc> findRange(String name, double x1, double y1, double x2, double y2) {
		// 筛选条件
		Criteria cri = new Criteria();
		if (StringUtils.isNotBlank(name)) {
			CriteriaUtil.like(cri, "name", name);
		}
		// 坐标条件：矩形范围
		CriteriaUtil.withinBox(cri,"location", x1, y1, x2, y2);
		// 列表查询：db.userGeo.find({"location":{"$within":{"$box":[[x1,y1],[x2,y2]]}},"name":name})
		return this.findAll(QueryUtil.build(cri));
	}

	/**
	 * 查询周边的坐标
	 * 
	 * @param name			名称
	 * @param maxDistance	最远距离(千米)
	 * @param x				当前经度
	 * @param y				当前纬度
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年12月23日
	 */
	public List<UserGeoDoc> findNear(String name, int maxDistance, double x, double y) {
		// 筛选条件
		Criteria cri = new Criteria();
		if (StringUtils.isNotBlank(name)) {
			CriteriaUtil.like(cri, "name", name);
		}
		// 坐标条件：起始点，千米范围，球面计算
		NearQuery query = QueryUtil.nearSphericalQuery(QueryUtil.build(cri), x, y, maxDistance);
		// 附近查询：db.runCommand({geoNear : "userGeo",$near:[x,y],$maxDistance :maxDistance, query:{"name":name}})
		return this.findNear(query);
	}


}